package pruebas;


import modelo.Disparo;
import modelo.Jugador;
import modelo.Mina;
import modelo.MinaSubmarinaDobleConRetardo;
import modelo.MinaSubmarinaPorContacto;
import modelo.MinaSubmarinaPuntualConRetardo;
import modelo.MinaSubmarinaTripleConRetardo;
import modelo.Posicion;

import org.junit.Test;

import excepciones.LaPosicionYaTieneMinaExcepcion;
import junit.framework.TestCase;

public class JugadorTest extends TestCase {
	@Test
    public void testPasarUnTurnoRestaPuntos() {
    	Jugador unJugador = new Jugador(20);
    	
    	unJugador.pasarTurno();
    	
   		assertTrue("El jugador perdio 10 puntos",(unJugador.getPuntos() == 10));          
   		assertFalse("El jugador no perdio",unJugador.perdio());
    } 

	@Test
    public void testConCeroPuntosPerdidosPorTurnosElJugadorPierde() {
    	Jugador unJugador = new Jugador(20);

    	unJugador.pasarTurno();
    	unJugador.pasarTurno();
    	
   		assertTrue("El jugador tiene 0 puntos",(unJugador.getPuntos() == 0));  
   		assertTrue("El jugador perdio",unJugador.perdio());                
    } 

	@Test
    public void testConPuntosNegativosPerdidosPorTurnosElJugadorPierde() {
    	Jugador unJugador = new Jugador(20);

    	unJugador.pasarTurno();
    	unJugador.pasarTurno();
    	unJugador.pasarTurno();
    	
   		assertTrue("El jugador tiene -10 puntos",(unJugador.getPuntos() == -10));  
   		assertTrue("El jugador perdio",unJugador.perdio());                
    } 

	@Test
    public void testPonerMinaRestaPuntos() throws LaPosicionYaTieneMinaExcepcion {
    	Jugador unJugador = new Jugador(1000);
    	
    	unJugador.ponerMina(new Posicion(0,0));
    	
   		assertTrue("El jugador perdio puntos",(unJugador.getPuntos() < 1000));                
    } 

	@Test
    public void testPonerMinaConMenosPuntosDeLosNecesariosPierde() throws LaPosicionYaTieneMinaExcepcion {
    	Jugador unJugador = new Jugador(5);
    	
    	unJugador.ponerMina(new Posicion(0,0));
    	
   		assertTrue("El jugador perdio",(unJugador.perdio()));                
    } 

	@Test
    public void testSetMinaCambiaLaMinaAPoner() throws LaPosicionYaTieneMinaExcepcion {
    	Jugador unJugador = new Jugador(100);
    	
    	Mina unaMina = new MinaSubmarinaDobleConRetardo();
    	unJugador.setMina(unaMina);
    	
   		assertEquals("El jugador puso la mina seteada",unJugador.ponerMina(new Posicion(0,0)), unaMina);                
    } 

	@Test
    public void testPonerDosMinaSinSetEntreMedioSonDeLaMismaClase() throws LaPosicionYaTieneMinaExcepcion {
    	Jugador unJugador = new Jugador(100);
    	
    	unJugador.setMina(new MinaSubmarinaTripleConRetardo());
    	Mina minaA = unJugador.ponerMina(new Posicion(0,0));
    	Mina minaB = unJugador.ponerMina(new Posicion(0,0));
    	
   		assertEquals("Las dos minas son de la misma clase",minaA.getClass(),minaB.getClass());                
    } 
	
	@Test
    public void testPonerDosMinaSinSetEntreMedioSonMinasDiferentes() throws LaPosicionYaTieneMinaExcepcion {
    	Jugador unJugador = new Jugador(100);
    	
    	unJugador.setMina(new MinaSubmarinaPorContacto());
    	Mina minaA = unJugador.ponerMina(new Posicion(0,0));
    	Mina minaB = unJugador.ponerMina(new Posicion(0,0));
    	
   		assertFalse("Las dos minas son diferentes",minaA == minaB);                
    } 

	@Test
    public void testPonerDisparoRestaPuntosCorrectamente() throws LaPosicionYaTieneMinaExcepcion {
    	Jugador unJugador = new Jugador(1000);
    	unJugador.setMina(new Disparo());
    	
    	unJugador.ponerMina(new Posicion(0,0));
    	
   		assertTrue("El jugador perdio puntos corectamente",unJugador.getPuntos() == 800);                
    } 

	@Test
    public void testPonerMinaConRetardoRestaPuntosCorrectamente() throws LaPosicionYaTieneMinaExcepcion {
    	Jugador unJugador = new Jugador(1000);
    	unJugador.setMina(new MinaSubmarinaPuntualConRetardo());
    	
    	unJugador.ponerMina(new Posicion(0,0));
    	
   		assertTrue("El jugador perdio puntos corectamente",unJugador.getPuntos() == 950);                
    } 

	@Test
    public void testPonerMinaConDobleRetardoRestaPuntosCorrectamente() throws LaPosicionYaTieneMinaExcepcion {
    	Jugador unJugador = new Jugador(1000);
    	unJugador.setMina(new MinaSubmarinaDobleConRetardo());
    	
    	unJugador.ponerMina(new Posicion(0,0));
    	
   		assertTrue("El jugador perdio puntos corectamente",unJugador.getPuntos() == 900);                
    } 

	@Test
    public void testPonerMinaConTripleRetardoRestaPuntosCorrectamente() throws LaPosicionYaTieneMinaExcepcion {
    	Jugador unJugador = new Jugador(1000);
    	unJugador.setMina(new MinaSubmarinaTripleConRetardo());
    	
    	unJugador.ponerMina(new Posicion(0,0));
    	
   		assertTrue("El jugador perdio puntos corectamente",unJugador.getPuntos() == 875);                
    } 

	@Test
    public void testPonerMinaPorContactoRestaPuntosCorrectamente() throws LaPosicionYaTieneMinaExcepcion {
    	Jugador unJugador = new Jugador(1000);
    	unJugador.setMina(new MinaSubmarinaPorContacto());
    	
    	unJugador.ponerMina(new Posicion(0,0));
    	
   		assertTrue("El jugador perdio puntos corectamente",unJugador.getPuntos() == 850);                
    } 
}
